package br.unb.ida.midialab.pedparq;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class ResumoAtividade extends Activity{

	private MediaPlayer mp;
	public Atividade atividade = null;
	private Bundle bundleAtividade;
	ProgressBar mProgress;
	private Utils util = Utils.getInstance();
	private boolean isSoundStart = true;
	private Button botaoSync;

	private void makeStyle(String status) {
		@SuppressWarnings("unused")
		int color = Color.BLACK;
		refreshProgressBar(atividade.getPassos());
		if(status.equals("sedentario")){
			//audio
			if(isSoundStart){
				mp = MediaPlayer.create(this, R.raw.vicepronto);
				mp.start();
			}
			//roxo
			color = Color.rgb(160, 32, 240);
			findViewById(R.id.imageStatus).setBackgroundResource(R.drawable.sedentario);
			findViewById(R.id.res_resumo).setBackgroundResource(R.drawable.circulos_roxo);
		}
		if(status.equals("baixa_atividade")){
			//audio
			if(isSoundStart){
				mp = MediaPlayer.create(this, R.raw.vicepronto);
				mp.start();
			}
			//laranja
			color = Color.rgb(255,165,0);
			findViewById(R.id.imageStatus).setBackgroundResource(R.drawable.at_baixa);
			findViewById(R.id.res_resumo).setBackgroundResource(R.drawable.circulos_laranja);
		}
		if(status.equals("pouca_atividade")){
			//audio
			if(isSoundStart){
				mp = MediaPlayer.create(this, R.raw.vicepronto);
				mp.start();
			}
			//amarelo
			color = Color.rgb(255,255,0);
			findViewById(R.id.imageStatus).setBackgroundResource(R.drawable.at_pouca);		
			findViewById(R.id.res_resumo).setBackgroundResource(R.drawable.circulos_amarelo);
		}
		if(status.equals("ativa")){
			//audio
			if(isSoundStart){
				mp = MediaPlayer.create(this, R.raw.ativo_final);
				mp.start();
			}
			//verde
			color = Color.rgb(0,255,0);
			findViewById(R.id.imageStatus).setBackgroundResource(R.drawable.ativa);
			findViewById(R.id.res_resumo).setBackgroundResource(R.drawable.circulos_verde);
		}
		if(status.equals("altamente_ativa")){
			//audio
			if(isSoundStart){
				mp = MediaPlayer.create(this, R.raw.vicepronto);
				mp.start();
			}
			//azul
			color = Color.rgb(0,0,255);
			findViewById(R.id.imageStatus).setBackgroundResource(R.drawable.super_ativa);			
			findViewById(R.id.res_resumo).setBackgroundResource(R.drawable.circulos_azul);
		}
		
		TextView textAux = (TextView) this.findViewById(R.id.res_duracao_value);
		textAux.setText(String.valueOf(util.tempoToString(atividade.getTempoAtividade())));
		
		textAux = (TextView) findViewById(R.id.res_step_value);
		textAux.setText(String.valueOf(atividade.getPassos()));
		
		textAux = (TextView) findViewById(R.id.res_distance_value);
		textAux.setText(String.valueOf(atividade.getDistancia()));
		
		textAux = (TextView) findViewById(R.id.res_pace_value);
		textAux.setText(String.valueOf(atividade.getPassos()));
		
		textAux = (TextView) findViewById(R.id.res_speed_value);
		textAux.setText(String.valueOf(atividade.getVelMedia()));
		
		textAux = (TextView) findViewById(R.id.res_calories_value);
		textAux.setText(String.valueOf(atividade.getCalorias()));
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.bundleAtividade = this.getIntent().getExtras();
		setAtividade(bundleAtividade);
		setContentView(R.layout.resumo);
		isFromLista(bundleAtividade);
		mp = MediaPlayer.create(this, R.raw.coin);
		mProgress = (ProgressBar) findViewById(R.id.res_progressBar1);
		makeStyle(atividade.getStatus());
		botaoSync = (Button) findViewById(R.id.bSync);
		if(atividade.getIsSync()==1){
			botaoSync.setVisibility(View.INVISIBLE);
		}
	}
	

	private void isFromLista(Bundle bundleAtividade2) {
		if(bundleAtividade2.getBoolean("fromLista")){
			Button botaoLista = (Button) findViewById(R.id.bLista);
			botaoLista.setVisibility(View.INVISIBLE);
			isSoundStart = false;
		}
		
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		mp.stop();
	}
	
	public void setAtividade(Bundle bAtividade) {
		this.atividade = new Atividade();
		if(bAtividade.getString("id")!=null)
			atividade.setId(bAtividade.getString("id"));
		else{
			DbHelper db = new DbHelper(this);
			atividade.setId(db.getAtividadeByDate(toString().valueOf(bAtividade.getLong("data"))).getId());
		}
		atividade.setCalorias(bAtividade.getInt("calorias"));
		atividade.setDate(bAtividade.getLong("data"));
		atividade.setDistancia(bAtividade.getFloat("distancia"));
		atividade.setPassos(bAtividade.getInt("passos"));
		atividade.setRitmo(bAtividade.getInt("ritmo"));
		atividade.setStatus(bAtividade.getString("status"));
		atividade.setTempoAtividade(bAtividade.getLong("tempoMili"));
		atividade.setVelMedia(bAtividade.getFloat("velMedia"));
		atividade.setTipo(bAtividade.getString("tipo"));
		atividade.setIsSync(bAtividade.getInt("isSync"));
	}
	
	public void listaAtividade (View view){
		Intent iLista = new Intent(this, ListaAtividades.class);
		startActivity(iLista);
	}
	
	public void postData(View view){
		//Create a new httpClient and Post Header
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost httpPost = new HttpPost("http://parq.unb.br/pedparq/inserir.php");
		
		//Add data
		List<NameValuePair> nameValuePairs = makeListaAtividade();
		//TODO colocar todos os campos na lista
		
		try {
			httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			
			//Execute HTTP Post Request
			ResponseHandler<String> responseHandler = new BasicResponseHandler();
			String response = httpClient.execute(httpPost, responseHandler);
			
			//This is the response from a php application
			String reverseString = response;
			if(reverseString.equals("success")){
				atividade.setIsSync(1);
				DbHelper db = new DbHelper(this);
				int rowsUpdadete = db.updateAtividadeSync(atividade.getId());
				if(rowsUpdadete == 1){
					botaoSync.setVisibility(View.INVISIBLE);
					Toast.makeText(this, "Atividade sincronizada", Toast.LENGTH_SHORT).show();
				}else if(rowsUpdadete <= 0){
					Toast.makeText(this, "Atividade não sincronizada", Toast.LENGTH_LONG).show();
				}
			}else{
				Toast.makeText(this, "Atividade não sincronizada", Toast.LENGTH_LONG).show();
			}
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private List<NameValuePair> makeListaAtividade() {
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		
		if(atividade.getId()!=null)
			nameValuePairs.add(new BasicNameValuePair("id", atividade.getId()));
		else
			nameValuePairs.add(new BasicNameValuePair("id", "null"));
		if(atividade.getUser()!=null)
			nameValuePairs.add(new BasicNameValuePair("user", atividade.getUser()));
		else
			nameValuePairs.add(new BasicNameValuePair("user", getUsername()));
		
		nameValuePairs.add(new BasicNameValuePair("status", atividade.getStatus()));
		nameValuePairs.add(new BasicNameValuePair("tipo", atividade.getTipo()));
		nameValuePairs.add(new BasicNameValuePair("calorias", String.valueOf(atividade.getCalorias())));
		nameValuePairs.add(new BasicNameValuePair("data", String.valueOf(atividade.getDate())));
		nameValuePairs.add(new BasicNameValuePair("distancia", String.valueOf(atividade.getDistancia())));
		nameValuePairs.add(new BasicNameValuePair("passos", String.valueOf(atividade.getPassos())));
		nameValuePairs.add(new BasicNameValuePair("ritmo", String.valueOf(atividade.getRitmo())));
		nameValuePairs.add(new BasicNameValuePair("tempoAtividade", String.valueOf(atividade.getTempoAtividade())));
		nameValuePairs.add(new BasicNameValuePair("velMedia", String.valueOf(atividade.getVelMedia())));
		
		try {
			String secAux = nameValuePairs.get(1).toString()+String.valueOf(atividade.getTempoAtividade());
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(secAux.getBytes());
			BigInteger hash = new BigInteger(1, md.digest());
			String sec = hash.toString(16);
			while(sec.length() < 32)
				sec = "0" + sec;
			if(sec!=null)
				nameValuePairs.add(new BasicNameValuePair("sec", sec));
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
		return nameValuePairs;
	}
	
	public String getUsername(){
        AccountManager manager = AccountManager.get(this); 
        Account[] accounts = manager.getAccountsByType("com.google"); 
        List<String> possibleEmails = new LinkedList<String>();

        for (Account account : accounts) {
          // TODO: Check possibleEmail against an email regex or treat
          // account.name as an email address only for certain account.type values.
          possibleEmails.add(account.name);
        }

        if(!possibleEmails.isEmpty() && possibleEmails.get(0) != null){
            String email = possibleEmails.get(0);
            String[] parts = email.split("@");
            if(parts.length > 0 && parts[0] != null)
                return parts[0];
            else
                return null;
        }else
            return null;
    }

	public void refreshProgressBar(int mStepValue) {
		if(mStepValue >=0 && mStepValue < 5000){
			if(mStepValue == 0){
				mProgress.setMax(5000);
			}
			mProgress.setProgress(mStepValue);
		}
		else if(mStepValue >= 5000 && mStepValue < 7500){
			if(mStepValue == 5000){
				mProgress.setVisibility(View.GONE);
				mProgress = (ProgressBar) findViewById(R.id.res_progressBar2);
				mProgress.setVisibility(View.VISIBLE);
				mProgress.setProgress(0);
				mProgress.setMax(2500);
			}
			mProgress.setProgress(mStepValue-5000);
		}
		else if(mStepValue >= 7500 && mStepValue < 10000){
			if(mStepValue == 7500){
				mProgress.setVisibility(View.GONE);
				mProgress = (ProgressBar) findViewById(R.id.res_progressBar3);
				mProgress.setVisibility(View.VISIBLE);
				mProgress.setProgress(0);
				mProgress.setMax(2500);
			}
			mProgress.setProgress(mStepValue-7500);
		}
		else if(mStepValue >= 10000 && mStepValue < 12500){
			if(mStepValue == 10000){
				mProgress.setVisibility(View.GONE);
				mProgress = (ProgressBar) findViewById(R.id.res_progressBar4);
				mProgress.setVisibility(View.VISIBLE);
				mProgress.setProgress(0);
				mProgress.setMax(2500);
			}
			mProgress.setProgress(mStepValue-1000);
		}
		else if(mStepValue >= 12500){
			if(mStepValue == 12500){
				mProgress.setVisibility(View.GONE);
				mProgress = (ProgressBar) findViewById(R.id.res_progressBar5);
				mProgress.setVisibility(View.VISIBLE);
				mProgress.setMax(5000);
			}
			mProgress.setProgress(mStepValue-12500);
		}
	}

}
